/*
 * MStream.h
 *
 *  Created on: 2018-11-15
 *      Author: chuanjiang.zh
 */

#ifndef MSTREAM_H_
#define MSTREAM_H_

#include "BasicType.h"
#include "MFormat.h"
#include "MEvent.h"
#include "MFrame.h"


/// 媒体流播放状态.
enum MStreamState
{
    MSTATE_STOPPED = 0,
    MSTATE_PAUSED,
    MSTATE_PLAYING
};


/// 媒体流接收器.
class MStreamSink
{
public:
    virtual ~MStreamSink() {}

    virtual void setFormat(const MFormat& fmt) =0;

    virtual void writePacket(MPacket& pkt) =0;

    virtual void writeEvent(int event) =0;
};


/// 媒体源.
class MStreamSource
{
public:
    virtual ~MStreamSource() {}

    virtual int open(const char* url, const char* params) =0;

    virtual void close() =0;

    virtual bool isOpen() =0;

    /// 获取流的URL
    virtual const char* getUrl() =0;

    /**
     * 获取流的媒体格式
     * @param fmt   媒体格式
     * @return true 表示成功
     */
    virtual bool getFormat(MFormat& fmt) =0;

    /// 开始
    virtual int startStream() =0;

    /// 暂停
    virtual int pauseStream() =0;

    /// 停止
    virtual void stopStream() =0;

    /**
     * 获取当前播放状态
     * @return
     */
    virtual int getState() =0;

    /**
     * 设置回调
     * @param sink
     */
    virtual void setSink(MStreamSink* sink) =0;

    /**
     * 强制关键帧输出.
     * @return
     */
    virtual bool forceKeyFrame() =0;

    /**
     * 获取媒体时长, 单位为秒.
     * @return 媒体时长.
     */
    virtual int getDuration() =0;

    /**
     * 获取当前播放时间, 单位为毫秒.
     * @return 播放时间
     */
    virtual int64_t getTime() =0;

    /**
     * 是否支持定位操作
     * @return
     */
    virtual bool isSeekable() =0;

    /**
     * 定位到指定时间点开始播放.
     * @param pts   时间, 单位为毫秒
     * @return
     */

    virtual int seek(int64_t pts) = 0;

    /**
     * 设置播放速度
     * @param scale 播放速度，范围为[1/8, 8], 1表示正常速度，8 表示快八倍速，1/8表示慢八倍速.
     * @return 0 表示成功
     */
    virtual int setScale(double scale) = 0;

    /**
     * 获取播放速度
     * @return 1.0 表示正常速度.
     */

    virtual double getScale() = 0;

    /**
    * 设置播放范围
    * @param beginPts 开始时间，单位为毫秒
    * @param endPts 结束时间，单位为毫秒
    * @return 0 表示成功
    */

    virtual int setRange(int64_t beginPts, int64_t endPts) = 0;
};


/// 媒体通道.
class MStreamChannel : public MStreamSource, public MStreamSink
{
public:
    virtual ~MStreamChannel() {}

};




#endif /* MSTREAM_H_ */
